﻿#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
//暑假练习2

//以下算法题源于leetcode和牛客

//int pivotIndex(int* nums, int numsSize) {
//    int i = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        int lsum = 0, rsum = 0;
//        for (int j = 0; j < numsSize; j++)
//        {
//            if (j < i)
//            {
//                lsum += nums[j];
//            }
//            if (j > i)
//            {
//                rsum += nums[j];
//            }
//        }
//        if (lsum == rsum)
//        {
//            return i;
//        }
//    }
//    return -1;
//}
//
//int main()
//{
//    int arr[] = { 2, 8, 1, 7, 3 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    pivotIndex(arr, sz);
//    return 0;
//}

//////////////////////////////////////////////////////////////////////////////////////

//int* selfDividingNumbers(int left, int right, int* returnSize) {
//    int* ret = (int*)calloc(1000, sizeof(int));
//    for (int i = left; i <= right; i++)
//    {
//        int flag = 1;
//        while (i)
//        {
//            if ((i%10)==0 || !(i % (i % 10)))
//            {
//                break;
//            }
//            i /= 10;
//            flag = 0;
//        }
//        if (flag = 0)
//        {
//            ret[*(returnSize++)] = i;
//        }
//    }
//    return ret;
//}



int* selfDividingNumbers(int left, int right, int* returnSize) {
    int* ret = (int*)calloc(1000, sizeof(int));//动态申请足够大的空间用于存放返回的自除数
    *returnSize = 0;
    for (int i = left; i <= right; i++) {
        int num = i;
        while (num) {
            int remainder = num % 10;//计算余数
            if (remainder == 0 || (i % remainder) != 0) {//判断i自身与余数取模是否为0
                break;
            }
            num /= 10;
        }
        //如果num==0表示通过了每一位数的取模判断，则i就是自除数
        if (num == 0) ret[(*returnSize)++] = i;
    }
    return ret;
}


int main1()
{
    int left, right;
    cin >> left >> right;
    int arr[1000] = { 0 };
    selfDividingNumbers(left,right,arr);
    return 0;
}


//////////////////////////////////////////////////////////////////////////
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    int* ret = (int*)calloc(1000, sizeof(int));
    int k = 1;
    int j = numsSize;
    while (j--)
    {
        for (int i = 0; i < numsSize; i++)
        {
            k = k * nums[i + 1];
        }
        ret[(*returnSize)++] = k;
    }
    return ret;
}

int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    int* ret = (int*)malloc(numsSize * sizeof(int));
    *returnSize = numsSize;
    int left = 1, right = 1;
    //第一次循环，将当前位置左边的数字乘积填入返回数组中
    for (int i = 0; i < numsSize; i++) {
        ret[i] = left;// 1 nums[0] nums[0]*nums[1] num[0]*nums[1]*nums[2] ....
        left *= nums[i];
    }
    //第二次循环，对于返回数组的元素从后往前进行，每次乘以右边元素的乘积
    for (int i = numsSize - 1; i >= 0; i--) {
        ret[i] *= right; //最后一个成绩不需要乘以最后元素，乘以1就行
        right *= nums[i]; //right变化：1 nums[end] nums[end]*nums[end-1] .....
    }
    return ret;
}


///////////////////////////////////////////////////////
int Add(int num1, int num2) {
    while (num2 != 0) { //进位不为0则持续与相加结果进行相加
        int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
        num2 = (num1 & num2) << 1;//同1的位相加则会进位
        num1 = tmp;
    }
    return num1;
}

/////////////////////////////////////////////////////////////////
int* ﬁndDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
    for (int i = 0; i < numsSize; i++) {
        if (nums[abs(nums[i]) - 1] > 0)
            nums[abs(nums[i]) - 1] = -(nums[abs(nums[i]) - 1]);
    }
    int* ret = (int*)malloc(sizeof(int) * (numsSize));
    *returnSize = 0;
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] > 0) {
            ret[*returnSize] = i + 1;
            *returnSize += 1;
        }
    }
    return ret;
}